

# 实现的是一个父类
"""
包含功能 ：
 1. 处理url的方法 ： get_url
 2 . 重写get，post方法 ， get() ,post()
        1. 它能进行异常捕获
        2. 它可以支持自动处理headers
        3. 返回JSON格式 。

3. 登录功能 : login()
4. 处理headers的方法
"""

from setting import BASE_URL,LOGIN_INFO
import requests
from loguru import logger
from cacheout import Cache

cache = Cache()

class Base():


    def get_url(self,path,params=None):
        """
        返回一个完整的url
        :param path: 就是接口地址，比如：/admin/admin/update
        :param params: 就是查询参数，page=1&limit=20&sort=add_time&order=desc
        :return: http://192.168.40.128:9527/admin/admin/update
        """
        if params is not None:
            return BASE_URL + path + params
        return BASE_URL + path


    def get(self,url):
        """
        请求get接口返回的JSON数据
        :param url: 接口的地址
        :return: 返回的是JSON数据
        """
        result = None
        try:
            response = requests.get(url,headers=self.__get_headers())
            result = response.json()
            logger.debug("请求地址:{},请求方法:{},返回结果{}".format(url,'get',result))
            return result
        except Exception as e:
            logger.error("请求get方法报错:{},请求结果:{}".format(e,result))



    def post(self,url,data):
        """
        请求post接口返回JSON数据
        :param url: 接口的地址
        :param data: 接口的请求体 ，传递进来的就是字典
        :return: 返回JSON格式的数据
        """
        result = None
        try:
            response = requests.post(url,json=data,headers=self.__get_headers())
            result = response.json()
            logger.debug("请求地址:{},请求方法:{},请求体:{},返回结果{}".format(url, 'post',data, result))
            return result
        except Exception as e:
            logger.error("请求get方法报错:{},请求结果:{}".format(e, result))

    def login(self):
        """
        请求登录接口，返回登录数据
        :return: 登录结果的json格式
        """
        # 1. 请求登录接口
        login_url = self.get_url('/admin/auth/login')
        login_result = self.post(login_url,LOGIN_INFO)
        logger.info("登录结果:{}".format(login_result))
        # 2. 获取token值
        if login_result.get('errno') == 0:
            token = login_result.get('data').get('token')
            # 3. 将token保存到缓存 ：cacheout
            cache.set('token',token)
        return login_result

    def __get_headers(self):
        """
        返回请求头的数据,是一个字典
        :return: {"Conetent-Type":"application/json","X-Litemall-Admin-Token":token}
        """
        # 1. 定义一个字典headers,设置一个默认值 ，包括了Content-Type
        headers = {"Content-Type":"application/json"}
        # 2. 从缓存当中查看是否存在token ，若存在，更新上面的字典
        token = cache.get('token')
        if token:
            headers.update({"X-Litemall-Admin-Token":token})
        # 3. 返回字典
        return headers


if __name__ == '__main__':
    base = Base()
    print(base.get_url('/admin/admin/update'))


    result = base.login()
    # print(result)

